home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / pwrwin.exe / NODE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-06-06  |  2.0 KB  |  79 lines

  1. #include "node.h"
  2.  
  3. #define FALSE        0
  4. #define TRUE        1
  5.  
  6. struct Node *FindNode ( struct NodeHead *NodeHead, int item)
  7. {
  8. register struct Node *RunNode = NodeHead->FirstNode;
  9.   while ( RunNode)
  10.     if( RunNode->Item==item) return RunNode;
  11.      else RunNode = RunNode->NextNode;
  12. return 0;
  13. }
  14.  
  15. int AddNode (struct NodeHead *NodeHead, int item)
  16. {
  17. register struct Node *NewNode;
  18.  
  19.  NewNode = (struct Node *) malloc (sizeof(struct Node));
  20.  NewNode->Item = item;
  21.  NewNode->NextNode = 0;
  22.  NewNode->PrevNode = NodeHead->LastNode;
  23.  if ( !NodeHead->count) NodeHead->FirstNode = NewNode;
  24.   else NodeHead->LastNode->NextNode = NewNode;
  25.  NodeHead->LastNode = NewNode;
  26.  
  27. return ++NodeHead->count;
  28. }
  29.  
  30. int DeleteNodeList ( struct NodeHead *NodeHead)
  31. {
  32. register struct Node *RunNode = NodeHead->FirstNode;
  33. int item = RunNode->Item;
  34.  
  35.  while ( RunNode) {
  36.     DeleteNode ( NodeHead, item);
  37.     item = GetNode ( NodeHead, item, GN_NEXT);
  38.     }
  39. }
  40.  
  41. int DeleteNode ( struct NodeHead *NodeHead, int item)
  42. {
  43. struct Node *DelNode;
  44.  
  45.   if (!(DelNode=FindNode(NodeHead,item))) return FALSE;
  46.  
  47.   if ( DelNode->PrevNode) DelNode->PrevNode->NextNode = DelNode->NextNode;
  48.   if ( DelNode->NextNode) DelNode->NextNode->PrevNode = DelNode->PrevNode;
  49.   if ( DelNode==NodeHead->FirstNode) NodeHead->FirstNode = DelNode->NextNode;
  50.   if ( DelNode==NodeHead->LastNode)  NodeHead->LastNode = DelNode->PrevNode;
  51.   free ( DelNode);
  52. return --NodeHead->count;
  53. }
  54.  
  55. int GetNode ( struct NodeHead *NodeHead, int item, int Mode)
  56. {
  57. struct Node *Node;
  58. int newitem;
  59.  
  60.    switch (Mode) {
  61.     case GN_FIRST:
  62.         if ( NodeHead->FirstNode) return NodeHead->FirstNode->Item;
  63.         break;
  64.     case GN_LAST:
  65.         if ( NodeHead->LastNode)  return NodeHead->LastNode->Item;
  66.         break;
  67.     }
  68.    if (!(Node = FindNode (NodeHead,item))) return 0L;
  69.    switch ( Mode) {
  70.     case GN_NEXT:
  71.         if ( Node->NextNode) return Node->NextNode->Item;
  72.         break;
  73.     case GN_PREV:
  74.         if ( Node->PrevNode) return Node->PrevNode->Item;
  75.         break;
  76.     }
  77. return 0;
  78. }
  79.